Plots showing activation function behaviour of different biological interactions.

1 Activation functions

In the case where A activates or inhibits B, the rate equations are shown below which are equal to the activation equations due to the parameter choices.

2 OR based interactions with the SAME act/inhib effect

Interactions covered here are those where both the regulators have the same activation behaviour, that is either both are activators or both are inhibitors. Each regulator complements the other.

The case of independent OR inhibitions (right figures) looks more like the scenario where A and B inhibit C with dependence.

3 AND based interactions with the SAME act/inhib effect

Interactions covered here are those where both the regulators have the same activation behaviour, that is either both are activators or both are inhibitors. Both regulators work together therefore are independent.

The case of independent OR inhibitions (right figures) looks more like the scenario where A or B inhibit C with independence.

4 Interactions with the DIFFERENT act/inhib effect

Interactions covered here are those where both the regulators have the DIFFERENT activation behaviour, that is one is an activator while the other an inhibitor.

The case of dependent regulators (right figures) looks more like the scenario where A activates C but B sequesters this regulation.

The case of independent regulators (left figures) looks more like the scenario where B activates C but A dominantly activates C. I am sure whether this kind of regulatory relations exist in biology.

5 OR with different act/inhib effect further investigation

Lac operon regulation

Lac operon regulation

6 Generalization of complex regulatory behaviour

A represses C with the corepressor L. X inhibits this repression.

x-axis is L

y-axis is X

7 Conditional dependence

Input models setting

LS0tDQp0aXRsZTogIkFjdGl2YXRpb24gZnVuY3Rpb24gY2hhcmFjdGVyaXN0aWNzIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiANCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvYzogeWVzDQogICAgZmlnX2NhcHRpb246IHllcw0KLS0tDQoNClBsb3RzIHNob3dpbmcgYWN0aXZhdGlvbiBmdW5jdGlvbiBiZWhhdmlvdXIgb2YgZGlmZmVyZW50IGJpb2xvZ2ljYWwgaW50ZXJhY3Rpb25zLg0KDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0Kc291cmNlKCcuLi9HcmFwaEdSTi1tZXRob2RzLlInKQ0Kc291cmNlKCcuLi9HcmFwaEdSTi5SJykNCnNvdXJjZSgnLi4vU2ltdWxhdGlvbkdSTi1tZXRob2RzLlInKQ0Kc291cmNlKCcuLi9TaW11bGF0aW9uR1JOLlInKQ0Kc291cmNlKCdhbmFseXNpc19tZXRob2RzLlInKQ0KbGlicmFyeShpZ3JhcGgpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoZ3JpZCkNCmxpYnJhcnkoZ2dyYXBoKQ0KbGlicmFyeShkZVNvbHZlKQ0KbGlicmFyeShmb3JlYWNoKQ0KbGlicmFyeShubGVxc2x2KQ0KbGlicmFyeShtY2x1c3QpDQpsaWJyYXJ5KHNoaW55KQ0KDQojYWN0aXZhdGlvbiBmdW5jdGlvbg0KZkFjdCA8LSBmdW5jdGlvbihURiwgRUM1MCA9IDAuNSwgbiA9IDEuMzkpIHsNCiAgQiA9IChFQzUwIF4gbiAtIDEpIC8gKDIgKiBFQzUwIF4gbiAtIDEpDQogIEtfbiA9IChCIC0gMSkNCiAgYWN0ID0gQiAqIFRGIF4gbiAvIChLX24gKyBURiBeIG4pDQogIA0KICByZXR1cm4oYWN0KQ0KfQ0KDQojbXVsdGlwbG90IGZ1bmN0aW9uDQptdWx0aXBsb3QgPC0gZnVuY3Rpb24oLi4uLCBwbG90bGlzdD1OVUxMLCBmaWxlLCBjb2xzPTEsIGxheW91dD1OVUxMKSB7DQoJDQoJIyBNYWtlIGEgbGlzdCBmcm9tIHRoZSAuLi4gYXJndW1lbnRzIGFuZCBwbG90bGlzdA0KCXBsb3RzIDwtIGMobGlzdCguLi4pLCBwbG90bGlzdCkNCgkNCgludW1QbG90cyA9IGxlbmd0aChwbG90cykNCgkNCgkjIElmIGxheW91dCBpcyBOVUxMLCB0aGVuIHVzZSAnY29scycgdG8gZGV0ZXJtaW5lIGxheW91dA0KCWlmIChpcy5udWxsKGxheW91dCkpIHsNCgkJIyBNYWtlIHRoZSBwYW5lbA0KCQkjIG5jb2w6IE51bWJlciBvZiBjb2x1bW5zIG9mIHBsb3RzDQoJCSMgbnJvdzogTnVtYmVyIG9mIHJvd3MgbmVlZGVkLCBjYWxjdWxhdGVkIGZyb20gIyBvZiBjb2xzDQoJCWxheW91dCA8LSBtYXRyaXgoc2VxKDEsIGNvbHMgKiBjZWlsaW5nKG51bVBsb3RzL2NvbHMpKSwNCgkJCQkJCSBuY29sID0gY29scywgbnJvdyA9IGNlaWxpbmcobnVtUGxvdHMvY29scykpDQoJfQ0KCQ0KCWlmIChudW1QbG90cz09MSkgew0KCQlwcmludChwbG90c1tbMV1dKQ0KCQkNCgl9IGVsc2Ugew0KCQkjIFNldCB1cCB0aGUgcGFnZQ0KCQlncmlkLm5ld3BhZ2UoKQ0KCQlwdXNoVmlld3BvcnQodmlld3BvcnQobGF5b3V0ID0gZ3JpZC5sYXlvdXQobnJvdyhsYXlvdXQpLCBuY29sKGxheW91dCkpKSkNCgkJDQoJCSMgTWFrZSBlYWNoIHBsb3QsIGluIHRoZSBjb3JyZWN0IGxvY2F0aW9uDQoJCWZvciAoaSBpbiAxOm51bVBsb3RzKSB7DQoJCQkjIEdldCB0aGUgaSxqIG1hdHJpeCBwb3NpdGlvbnMgb2YgdGhlIHJlZ2lvbnMgdGhhdCBjb250YWluIHRoaXMgc3VicGxvdA0KCQkJbWF0Y2hpZHggPC0gYXMuZGF0YS5mcmFtZSh3aGljaChsYXlvdXQgPT0gaSwgYXJyLmluZCA9IFRSVUUpKQ0KCQkJDQoJCQlwcmludChwbG90c1tbaV1dLCB2cCA9IHZpZXdwb3J0KGxheW91dC5wb3Mucm93ID0gbWF0Y2hpZHgkcm93LA0KCQkJCQkJCQkJCQlsYXlvdXQucG9zLmNvbCA9IG1hdGNoaWR4JGNvbCkpDQoJCX0NCgl9DQp9DQoNCm5zaXplID0gNDANCmBgYA0KDQojQWN0aXZhdGlvbiBmdW5jdGlvbnMNCkluIHRoZSBjYXNlIHdoZXJlICoqQSoqIGFjdGl2YXRlcyBvciBpbmhpYml0cyAqKkIqKiwgdGhlIHJhdGUgZXF1YXRpb25zIGFyZSBzaG93bg0KYmVsb3cgd2hpY2ggYXJlIGVxdWFsIHRvIHRoZSBhY3RpdmF0aW9uIGVxdWF0aW9ucyBkdWUgdG8gdGhlIHBhcmFtZXRlciBjaG9pY2VzLg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNhY3RpdmF0aW9uIGZ1bmN0aW9uIHBsb3RzDQpmID0gZnVuY3Rpb24oQSwgcmF0ZWVxbikgew0KICBCID0gMA0KICBldmFsKHBhcnNlKHRleHQgPSByYXRlZXFuKSkNCn0NCkEgPSBzZXEoMCwgMSwgbGVuZ3RoLm91dCA9IDEwMCkNCg0KI0EtPkINCmdhY3QgPSBuZXcoJ0dyYXBoR1JOJykNCmdhY3QgPSBhZGROb2RlKGdhY3QsICdBJykNCmdhY3QgPSBhZGROb2RlKGdhY3QsICdCJykNCmdhY3QgPSBhZGRFZGdlKGdhY3QsICdBJywgJ0InLCBhY3RpdmF0aW9uID0gVCkNCmFjdGVxbiA9IGdlbmVyYXRlUmF0ZUVxbihnZXROb2RlKGdhY3QsICdCJyksIGdhY3QpDQpCID0gZihBLCBhY3RlcW4pDQpwbG90KEEsIEIsIGNvbCA9IDMsIHR5cGUgPSAnbCcsIG1haW4gPSAnQSBzaW5nbGUgYWN0aXZhdGlvbiBmdW5jdGlvbicpDQoNCiNBLT5CDQpnaW5iID0gbmV3KCdHcmFwaEdSTicpDQpnaW5iID0gYWRkTm9kZShnaW5iLCAnQScpDQpnaW5iID0gYWRkTm9kZShnaW5iLCAnQicpDQpnaW5iID0gYWRkRWRnZShnaW5iLCAnQScsICdCJywgYWN0aXZhdGlvbiA9IEYpDQppbmJlcW4gPSBnZW5lcmF0ZVJhdGVFcW4oZ2V0Tm9kZShnaW5iLCAnQicpLCBnaW5iKQ0KQiA9IGYoQSwgaW5iZXFuKQ0KcGFyKG5ldyA9IFQpDQpwbG90KEEsIEIsIGNvbCA9IDIsIHR5cGUgPSAnbCcpDQpwYXIobmV3ID0gRikNCmBgYA0KDQoNCiNPUiBiYXNlZCBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgU0FNRSBhY3QvaW5oaWIgZWZmZWN0DQpJbnRlcmFjdGlvbnMgY292ZXJlZCBoZXJlIGFyZSB0aG9zZSB3aGVyZSBib3RoIHRoZSByZWd1bGF0b3JzIGhhdmUgdGhlIHNhbWUNCmFjdGl2YXRpb24gYmVoYXZpb3VyLCB0aGF0IGlzIGVpdGhlciBib3RoIGFyZSBhY3RpdmF0b3JzIG9yIGJvdGggYXJlIGluaGliaXRvcnMuDQpFYWNoIHJlZ3VsYXRvciBjb21wbGVtZW50cyB0aGUgb3RoZXIuDQoNClRoZSBjYXNlIG9mIGluZGVwZW5kZW50IE9SIGluaGliaXRpb25zIChyaWdodCBmaWd1cmVzKSBsb29rcyBtb3JlIGxpa2UgdGhlDQpzY2VuYXJpbyB3aGVyZSAqKkEgYW5kIEIqKiBpbmhpYml0IEMgd2l0aCBkZXBlbmRlbmNlLg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmlncmFwaF9vcHRpb25zKHBsb3QubGF5b3V0PWxheW91dF9pbl9jaXJjbGUpDQpwYXIobWZyb3cgPSBjKDEsIDIpKQ0KY29sbWFwID0gYygnVFJVRScgPSAnZ3JlZW4nLCAnRkFMU0UnID0gJ3JlZCcpDQoNCiMyIGFjdGl2YXRvcnMNCmdhY3QgPSBuZXcoJ0dyYXBoR1JOJykNCmZvciAobiBpbiBMRVRURVJTWzE6M10pIHsNCiAgZ2FjdCA9IGFkZE5vZGUoZ2FjdCwgbikNCn0NCmdhY3QgPSBhZGRFZGdlKGdhY3QsICdBJywgJ0MnLCBhY3RpdmF0aW9uID0gVCkNCmdhY3QgPSBhZGRFZGdlKGdhY3QsICdCJywgJ0MnLCBhY3RpdmF0aW9uID0gVCkNCg0KZ2RmID0gR3JhcGhHUk4yZGYoZ2FjdCkNCmlnID0gZ3JhcGhfZnJvbV9kYXRhX2ZyYW1lKGdkZiRlZGdlcywgZGlyZWN0ZWQgPSBULCBnZGYkbm9kZXMpDQpFKGlnKSRjb2xvciA9IGNvbG1hcFthcy5jaGFyYWN0ZXIoRShpZykkdHlwZSldDQpwbG90KGlnLCB2ZXJ0ZXguc2l6ZSA9IG5zaXplLCBtYWluID0gJzIgaW5kZXBlbmRlbnQgYWN0aXZhdG9ycycpDQoNCiMyIGluaGliaXRvcnMNCmdpbmIgPSBuZXcoJ0dyYXBoR1JOJykNCmZvciAobiBpbiBMRVRURVJTWzE6M10pIHsNCiAgZ2luYiA9IGFkZE5vZGUoZ2luYiwgbikNCn0NCmdpbmIgPSBhZGRFZGdlKGdpbmIsICdBJywgJ0MnLCBhY3RpdmF0aW9uID0gRikNCmdpbmIgPSBhZGRFZGdlKGdpbmIsICdCJywgJ0MnLCBhY3RpdmF0aW9uID0gRikNCg0KZ2RmID0gR3JhcGhHUk4yZGYoZ2luYikNCmlnID0gZ3JhcGhfZnJvbV9kYXRhX2ZyYW1lKGdkZiRlZGdlcywgZGlyZWN0ZWQgPSBULCBnZGYkbm9kZXMpDQpFKGlnKSRjb2xvciA9IGNvbG1hcFthcy5jaGFyYWN0ZXIoRShpZykkdHlwZSldDQpwbG90KGlnLCB2ZXJ0ZXguc2l6ZSA9IG5zaXplLCBtYWluID0gJzIgaW5kZXBlbmRlbnQgaW5oaWJpdG9ycycpDQoNCiNhY3RpdmF0aW9uIGZ1bmN0aW9uIHBsb3RzDQpmID0gZnVuY3Rpb24oQSwgQiwgcmF0ZWVxbikgew0KICBDID0gMA0KICBldmFsKHBhcnNlKHRleHQgPSByYXRlZXFuKSkNCn0NCg0KYWN0ZXFuID0gZ2VuZXJhdGVSYXRlRXFuKGdldE5vZGUoZ2FjdCwgJ0MnKSwgZ2FjdCkNCmluYmVxbiA9IGdlbmVyYXRlUmF0ZUVxbihnZXROb2RlKGdpbmIsICdDJyksIGdpbmIpDQoNCiNwbG90IGFjdGl2YXRpb24gZnVuY3Rpb25zDQpwZGF0YSA9IGV4cGFuZC5ncmlkKCdBJyA9IHNlcSgwLCAxLCBsZW5ndGgub3V0ID0gMTAwKSwgJ0InID0gc2VxKDAsIDEsIGxlbmd0aC5vdXQgPSAxMDApKQ0KcGRhdGFbJ0FjdGl2YXRpb24nXSA9IGYocGRhdGEkQSwgcGRhdGEkQiwgYWN0ZXFuKQ0KcDEgPSBnZ3Bsb3QocGRhdGEsIGFlcyhBLCBCLCBmaWxsID0gQWN0aXZhdGlvbikpICsNCiAgZ2VvbV9yYXN0ZXIoKSArDQogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAnWWxPclJkJywgZGlyZWN0aW9uID0gMSkgKw0KICBnZ3RpdGxlKCcyIGluZGVwZW5kZW50IGFjdGl2YXRvcnMnKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKQ0KICApDQpwZGF0YVsnQWN0aXZhdGlvbiddID0gZihwZGF0YSRBLCBwZGF0YSRCLCBpbmJlcW4pDQpwMiA9IGdncGxvdChwZGF0YSwgYWVzKEEsIEIsIGZpbGwgPSBBY3RpdmF0aW9uKSkgKw0KICBnZW9tX3Jhc3RlcigpICsNCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICdZbE9yUmQnLCBkaXJlY3Rpb24gPSAxKSArDQogIGdndGl0bGUoJzIgaW5kZXBlbmRlbnQgaW5oaWJpdG9ycycpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpDQogICkNCg0KbXVsdGlwbG90KHAxLCBwMiwgY29scyA9IDIpDQpgYGANCg0KI0FORCBiYXNlZCBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgU0FNRSBhY3QvaW5oaWIgZWZmZWN0DQpJbnRlcmFjdGlvbnMgY292ZXJlZCBoZXJlIGFyZSB0aG9zZSB3aGVyZSBib3RoIHRoZSByZWd1bGF0b3JzIGhhdmUgdGhlIHNhbWUNCmFjdGl2YXRpb24gYmVoYXZpb3VyLCB0aGF0IGlzIGVpdGhlciBib3RoIGFyZSBhY3RpdmF0b3JzIG9yIGJvdGggYXJlIGluaGliaXRvcnMuDQpCb3RoIHJlZ3VsYXRvcnMgd29yayB0b2dldGhlciB0aGVyZWZvcmUgYXJlIGluZGVwZW5kZW50Lg0KDQpUaGUgY2FzZSBvZiBpbmRlcGVuZGVudCBPUiBpbmhpYml0aW9ucyAocmlnaHQgZmlndXJlcykgbG9va3MgbW9yZSBsaWtlIHRoZQ0Kc2NlbmFyaW8gd2hlcmUgKipBIG9yIEIqKiBpbmhpYml0IEMgd2l0aCBpbmRlcGVuZGVuY2UuDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KaWdyYXBoX29wdGlvbnMocGxvdC5sYXlvdXQ9bGF5b3V0X2FzX3N0YXIpDQpwYXIobWZyb3cgPSBjKDEsIDIpKQ0KY29sbWFwID0gYygnVFJVRScgPSAnZ3JlZW4nLCAnRkFMU0UnID0gJ3JlZCcpDQoNCiMyIGFjdGl2YXRvcnMNCmdhY3QgPSBuZXcoJ0dyYXBoR1JOJykNCmZvciAobiBpbiBMRVRURVJTWzE6M10pIHsNCiAgZ2FjdCA9IGFkZE5vZGUoZ2FjdCwgbikNCn0NCmdhY3QgPSBhZGRFZGdlKGdhY3QsIGMoJ0EnLCAnQicpLCAnQycsIGVkZ2V0eXBlID0gJ2FuZCcsIGFjdGl2YXRpb24gPSBjKFQsIFQpKQ0KDQpnZGYgPSBHcmFwaEdSTjJkZihnYWN0KQ0KaWcgPSBncmFwaF9mcm9tX2RhdGFfZnJhbWUoZ2RmJGVkZ2VzLCBkaXJlY3RlZCA9IFQsIGdkZiRub2RlcykNCkUoaWcpJGNvbG9yID0gYyhjb2xtYXBbYXMuY2hhcmFjdGVyKEUoaWcpJHR5cGUpWzE6Ml1dLCAnZGFya2dyZXknKQ0KcGxvdChpZywgdmVydGV4LnNpemUgPSBuc2l6ZSwgbWFpbiA9ICcyIGRlcGVuZGVudCBhY3RpdmF0b3JzJykNCg0KIzIgaW5oaWJpdG9ycw0KZ2luYiA9IG5ldygnR3JhcGhHUk4nKQ0KZm9yIChuIGluIExFVFRFUlNbMTozXSkgew0KICBnaW5iID0gYWRkTm9kZShnaW5iLCBuKQ0KfQ0KZ2luYiA9IGFkZEVkZ2UoZ2luYiwgYygnQScsICdCJyksICdDJywgZWRnZXR5cGUgPSAnYW5kJywgYWN0aXZhdGlvbiA9IGMoRiwgRikpDQoNCmdkZiA9IEdyYXBoR1JOMmRmKGdpbmIpDQppZyA9IGdyYXBoX2Zyb21fZGF0YV9mcmFtZShnZGYkZWRnZXMsIGRpcmVjdGVkID0gVCwgZ2RmJG5vZGVzKQ0KRShpZykkY29sb3IgPSBjKGNvbG1hcFthcy5jaGFyYWN0ZXIoRShpZykkdHlwZSlbMToyXV0sICdkYXJrZ3JleScpDQpwbG90KGlnLCB2ZXJ0ZXguc2l6ZSA9IG5zaXplLCBtYWluID0gJzIgZGVwZW5kZW50IGluaGliaXRvcnMnKQ0KDQojYWN0aXZhdGlvbiBmdW5jdGlvbiBwbG90cw0KZiA9IGZ1bmN0aW9uKEEsIEIsIHJhdGVlcW4pIHsNCiAgQyA9IDANCiAgZXZhbChwYXJzZSh0ZXh0ID0gcmF0ZWVxbikpDQp9DQoNCmFjdGVxbiA9IGdlbmVyYXRlUmF0ZUVxbihnZXROb2RlKGdhY3QsICdDJyksIGdhY3QpDQppbmJlcW4gPSBnZW5lcmF0ZVJhdGVFcW4oZ2V0Tm9kZShnaW5iLCAnQycpLCBnaW5iKQ0KDQojcGxvdCBhY3RpdmF0aW9uIGZ1bmN0aW9ucw0KcGRhdGEgPSBleHBhbmQuZ3JpZCgnQScgPSBzZXEoMCwgMSwgbGVuZ3RoLm91dCA9IDEwMCksICdCJyA9IHNlcSgwLCAxLCBsZW5ndGgub3V0ID0gMTAwKSkNCnBkYXRhWydBY3RpdmF0aW9uJ10gPSBmKHBkYXRhJEEsIHBkYXRhJEIsIGFjdGVxbikNCnAxID0gZ2dwbG90KHBkYXRhLCBhZXMoQSwgQiwgZmlsbCA9IEFjdGl2YXRpb24pKSArDQogIGdlb21fcmFzdGVyKCkgKw0KICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gJ1lsT3JSZCcsIGRpcmVjdGlvbiA9IDEpICsNCiAgZ2d0aXRsZSgnMiBkZXBlbmRlbnQgYWN0aXZhdG9ycycpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpDQogICkNCnBkYXRhWydBY3RpdmF0aW9uJ10gPSBmKHBkYXRhJEEsIHBkYXRhJEIsIGluYmVxbikNCnAyID0gZ2dwbG90KHBkYXRhLCBhZXMoQSwgQiwgZmlsbCA9IEFjdGl2YXRpb24pKSArDQogIGdlb21fcmFzdGVyKCkgKw0KICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gJ1lsT3JSZCcsIGRpcmVjdGlvbiA9IDEpICsNCiAgZ2d0aXRsZSgnMiBkZXBlbmRlbnQgaW5oaWJpdG9ycycpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpDQogICkNCg0KbXVsdGlwbG90KHAxLCBwMiwgY29scyA9IDIpDQpgYGANCg0KI0ludGVyYWN0aW9ucyB3aXRoIHRoZSBESUZGRVJFTlQgYWN0L2luaGliIGVmZmVjdA0KSW50ZXJhY3Rpb25zIGNvdmVyZWQgaGVyZSBhcmUgdGhvc2Ugd2hlcmUgYm90aCB0aGUgcmVndWxhdG9ycyBoYXZlIHRoZSBESUZGRVJFTlQNCmFjdGl2YXRpb24gYmVoYXZpb3VyLCB0aGF0IGlzIG9uZSBpcyBhbiBhY3RpdmF0b3Igd2hpbGUgdGhlIG90aGVyIGFuIGluaGliaXRvci4NCg0KVGhlIGNhc2Ugb2YgZGVwZW5kZW50IHJlZ3VsYXRvcnMgKHJpZ2h0IGZpZ3VyZXMpIGxvb2tzIG1vcmUgbGlrZSB0aGUNCnNjZW5hcmlvIHdoZXJlICoqQSoqIGFjdGl2YXRlcyAqKkMqKiBidXQgKipCKiogc2VxdWVzdGVycyB0aGlzIHJlZ3VsYXRpb24uDQoNClRoZSBjYXNlIG9mIGluZGVwZW5kZW50IHJlZ3VsYXRvcnMgKGxlZnQgZmlndXJlcykgbG9va3MgbW9yZSBsaWtlIHRoZQ0Kc2NlbmFyaW8gd2hlcmUgKipCKiogYWN0aXZhdGVzICoqQyoqIGJ1dCAqKkEqKiBkb21pbmFudGx5IGFjdGl2YXRlcyAqKkMqKi4gSSBhbQ0Kc3VyZSB3aGV0aGVyIHRoaXMga2luZCBvZiByZWd1bGF0b3J5IHJlbGF0aW9ucyBleGlzdCBpbiBiaW9sb2d5Lg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmlncmFwaF9vcHRpb25zKHBsb3QubGF5b3V0PWxheW91dF9hc19zdGFyKQ0KcGFyKG1mcm93ID0gYygxLCAyKSkNCmNvbG1hcCA9IGMoJ1RSVUUnID0gJ2dyZWVuJywgJ0ZBTFNFJyA9ICdyZWQnKQ0KDQojMSBhY3RpdmF0b3IgMSBpbmhpYml0b3IgT1INCmdvciA9IG5ldygnR3JhcGhHUk4nKQ0KZm9yIChuIGluIExFVFRFUlNbMTozXSkgew0KICBnb3IgPSBhZGROb2RlKGdvciwgbikNCn0NCmdvciA9IGFkZEVkZ2UoZ29yLCAnQScsICdDJywgYWN0aXZhdGlvbiA9IFQpDQpnb3IgPSBhZGRFZGdlKGdvciwgJ0InLCAnQycsIGFjdGl2YXRpb24gPSBGKQ0KDQpnZGYgPSBHcmFwaEdSTjJkZihnb3IpDQppZyA9IGdyYXBoX2Zyb21fZGF0YV9mcmFtZShnZGYkZWRnZXMsIGRpcmVjdGVkID0gVCwgZ2RmJG5vZGVzKQ0KRShpZykkY29sb3IgPSBjb2xtYXBbYXMuY2hhcmFjdGVyKEUoaWcpJHR5cGUpXQ0KcGxvdChpZywgdmVydGV4LnNpemUgPSBuc2l6ZSwgbWFpbiA9ICcxIGFjdCAxIGluaGliIGluZGVwZW5kZW50JykNCg0KIzEgYWN0aXZhdG9yIDEgaW5oaWJpdG9yIEFORA0KZ2FuZCA9IG5ldygnR3JhcGhHUk4nKQ0KZm9yIChuIGluIExFVFRFUlNbMTozXSkgew0KICBnYW5kID0gYWRkTm9kZShnYW5kLCBuKQ0KfQ0KZ2FuZCA9IGFkZEVkZ2UoZ2FuZCwgYygnQScsICdCJyksICdDJywgZWRnZXR5cGUgPSAnYW5kJywgYWN0aXZhdGlvbiA9IGMoVCwgRikpDQoNCmdkZiA9IEdyYXBoR1JOMmRmKGdhbmQpDQppZyA9IGdyYXBoX2Zyb21fZGF0YV9mcmFtZShnZGYkZWRnZXMsIGRpcmVjdGVkID0gVCwgZ2RmJG5vZGVzKQ0KRShpZykkY29sb3IgPSBjKGNvbG1hcFthcy5jaGFyYWN0ZXIoRShpZykkdHlwZSlbMToyXV0sICdkYXJrZ3JleScpDQpwbG90KGlnLCB2ZXJ0ZXguc2l6ZSA9IG5zaXplLCBtYWluID0gJzEgYWN0IDEgaW5oaWIgZGVwZW5kZW50JykNCg0KI2FjdGl2YXRpb24gZnVuY3Rpb24gcGxvdHMNCmYgPSBmdW5jdGlvbihBLCBCLCByYXRlZXFuKSB7DQogIEMgPSAwDQogIGV2YWwocGFyc2UodGV4dCA9IHJhdGVlcW4pKQ0KfQ0KDQpvcmVxbiA9IGdlbmVyYXRlUmF0ZUVxbihnZXROb2RlKGdvciwgJ0MnKSwgZ29yKQ0KYW5kZXFuID0gZ2VuZXJhdGVSYXRlRXFuKGdldE5vZGUoZ2FuZCwgJ0MnKSwgZ2FuZCkNCg0KI3Bsb3QgYWN0aXZhdGlvbiBmdW5jdGlvbnMNCnBkYXRhID0gZXhwYW5kLmdyaWQoJ0EnID0gc2VxKDAsIDEsIGxlbmd0aC5vdXQgPSAxMDApLCAnQicgPSBzZXEoMCwgMSwgbGVuZ3RoLm91dCA9IDEwMCkpDQpwZGF0YVsnQWN0aXZhdGlvbiddID0gZihwZGF0YSRBLCBwZGF0YSRCLCBvcmVxbikNCnAxID0gZ2dwbG90KHBkYXRhLCBhZXMoQSwgQiwgZmlsbCA9IEFjdGl2YXRpb24pKSArDQogIGdlb21fcmFzdGVyKCkgKw0KICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gJ1lsT3JSZCcsIGRpcmVjdGlvbiA9IDEpICsNCiAgZ2d0aXRsZSgnMSBhY3QgMSBpbmhpYiBpbmRlcGVuZGVudCcpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpDQogICkNCnBkYXRhWydBY3RpdmF0aW9uJ10gPSBmKHBkYXRhJEEsIHBkYXRhJEIsIGFuZGVxbikNCnAyID0gZ2dwbG90KHBkYXRhLCBhZXMoQSwgQiwgZmlsbCA9IEFjdGl2YXRpb24pKSArDQogIGdlb21fcmFzdGVyKCkgKw0KICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gJ1lsT3JSZCcsIGRpcmVjdGlvbiA9IDEpICsNCiAgZ2d0aXRsZSgnMSBhY3QgMSBpbmhpYiBkZXBlbmRlbnQnKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKQ0KICApDQoNCm11bHRpcGxvdChwMSwgcDIsIGNvbHMgPSAyKQ0KYGBgDQoNCiNPUiB3aXRoIGRpZmZlcmVudCBhY3QvaW5oaWIgZWZmZWN0IGZ1cnRoZXIgaW52ZXN0aWdhdGlvbg0KDQohW0xhYyBvcGVyb24gcmVndWxhdGlvbl0oYHIgZmlsZS5wYXRoKGdldHdkKCksICdsYWNfb3Blcm9uX3JlcHJlc3Npb24uUE5HJylgKXt3aWR0aD03MCV9DQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KaWdyYXBoX29wdGlvbnMocGxvdC5sYXlvdXQ9bGF5b3V0X2FzX3N0YXIpDQpwYXIobWZyb3cgPSBjKDEsIDIpKQ0KY29sbWFwID0gYygnVFJVRScgPSAnZ3JlZW4nLCAnRkFMU0UnID0gJ3JlZCcpDQoNCiMxIGFjdGl2YXRvciAxIGluaGliaXRvciBPUg0KZ29yID0gbmV3KCdHcmFwaEdSTicpDQpmb3IgKG4gaW4gYygnTGFjUmVwcmVzc29yJywgJ0xhY1hZQScsICdsYWN0b3NlJykpIHsNCiAgZ29yID0gYWRkTm9kZShnb3IsIG4pDQp9DQpnb3IgPSBhZGRFZGdlKGdvciwgJ0xhY1JlcHJlc3NvcicsICdMYWNYWUEnLCBhY3RpdmF0aW9uID0gRikNCmdvciA9IGFkZEVkZ2UoZ29yLCAnbGFjdG9zZScsICdMYWNYWUEnLCBhY3RpdmF0aW9uID0gVCkNCg0KZ2RmID0gR3JhcGhHUk4yZGYoZ29yKQ0KaWcgPSBncmFwaF9mcm9tX2RhdGFfZnJhbWUoZ2RmJGVkZ2VzLCBkaXJlY3RlZCA9IFQsIGdkZiRub2RlcykNCkUoaWcpJGNvbG9yID0gY29sbWFwW2FzLmNoYXJhY3RlcihFKGlnKSR0eXBlKV0NCnBsb3QoaWcsIHZlcnRleC5zaXplID0gbnNpemUsIG1haW4gPSAnMSBhY3QgMSBpbmhpYiBpbmRlcGVuZGVudCcpDQoNCiNhY3RpdmF0aW9uIGZ1bmN0aW9uIHBsb3RzDQpmID0gZnVuY3Rpb24odCwgc3RhdGUsIHBhcmFtcykgew0KICB3aXRoKGFzLmxpc3QoYyhzdGF0ZSwgcGFyYW1zKSksIHsNCiAgICBsaXN0KCdMYWNYWUEnID0gZXZhbChwYXJzZSh0ZXh0ID0gZ2VuZXJhdGVSYXRlRXFuKGdldE5vZGUoZ29yLCAnTGFjWFlBJyksIGdvcikpKSkNCiAgfSkNCn0NCg0KI3Bsb3QgTGFjWFlBIHdpdGggdmFyeWluZyBhbW91bnRzIG9mIGxhY3Rvc2UgYW5kIGZpeGVkIExhY1JlcHJlc3Nvcg0KczAgPSBjKCdMYWNYWUEnID0gMC41KQ0KcGFybXMgPSBjKCdMYWNSZXByZXNzb3InID0gMC43LCAnbGFjdG9zZScgPSAwKQ0KdGltZXMgPSBzZXEoMCwgNSwgYnkgPSAwLjAxKQ0KDQpyZXMgPSBmb3JlYWNoIChpID0gc2VxKDAsIDEsIGJ5ID0gMC4xKSwgLnBhY2thZ2VzID0gYygnZGVTb2x2ZScpLCAuY29tYmluZSA9IHJiaW5kKSAlZG8lIHsNCiAgcGFybXNbJ2xhY3Rvc2UnXSA9IGkNCiAgb3V0ID0gb2RlKHkgPSBzMCwgdGltZXMgPSB0aW1lcywgZnVuYyA9IGYsIHBhcm1zID0gcGFybXMpWyAsIDJdDQogIG91dCA9IGNiaW5kKCdMYWNYWUEnID0gb3V0LCAnbGFjdG9zZScgPSBpLCAndCcgPSB0aW1lcykNCiAgcmV0dXJuKG91dCkNCn0NCg0KcGRhdGEgPSBhcy5kYXRhLmZyYW1lKHJlcykNCmNvbG1hcCA9IGNvbG9yUmFtcFBhbGV0dGUoYygneWVsbG93JywgJ29yYW5nZScsICdyZWQnKSkobGVuZ3RoKHVuaXF1ZShyZXNbLCdsYWN0b3NlJ10pKSkNCm5hbWVzKGNvbG1hcCkgPSB1bmlxdWUocmVzWywnbGFjdG9zZSddKQ0KcGRhdGEkbGFjdG9zZSA9IGFzLmZhY3RvcihwZGF0YSRsYWN0b3NlKQ0KDQpwMSA9IGdncGxvdChwZGF0YSwgYWVzKHQsIExhY1hZQSwgY29sb3VyID0gbGFjdG9zZSkpICsgZ2VvbV9saW5lKHNpemUgPSAxLjIpKw0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGNvbG1hcCkgKw0KICBnZ3RpdGxlKCdMYWNSZXByZXNzb3IgPSAwLjcgKGZpeGVkKSxcbiBsYWN0b3NlID0gWzAsMV0nKQ0KDQojcGxvdCBMYWNYWUEgd2l0aCB2YXJ5aW5nIGFtb3VudHMgb2YgTGFjUmVwcmVzc29yIGFuZCBmaXhlZCBsYWN0b3NlDQpzMCA9IGMoJ0xhY1hZQScgPSAwLjUpDQpwYXJtcyA9IGMoJ0xhY1JlcHJlc3NvcicgPSAwLCAnbGFjdG9zZScgPSAwLjcpDQp0aW1lcyA9IHNlcSgwLCA1LCBieSA9IDAuMDEpDQoNCnJlcyA9IGZvcmVhY2ggKGkgPSBzZXEoMCwgMSwgYnkgPSAwLjEpLCAucGFja2FnZXMgPSBjKCdkZVNvbHZlJyksIC5jb21iaW5lID0gcmJpbmQpICVkbyUgew0KICBwYXJtc1snTGFjUmVwcmVzc29yJ10gPSBpDQogIG91dCA9IG9kZSh5ID0gczAsIHRpbWVzID0gdGltZXMsIGZ1bmMgPSBmLCBwYXJtcyA9IHBhcm1zKVsgLCAyXQ0KICBvdXQgPSBjYmluZCgnTGFjWFlBJyA9IG91dCwgJ0xhY1JlcHJlc3NvcicgPSBpLCAndCcgPSB0aW1lcykNCiAgcmV0dXJuKG91dCkNCn0NCg0KcGRhdGEgPSBhcy5kYXRhLmZyYW1lKHJlcykNCmNvbG1hcCA9IGNvbG9yUmFtcFBhbGV0dGUoYygneWVsbG93JywgJ29yYW5nZScsICdyZWQnKSkobGVuZ3RoKHVuaXF1ZShyZXNbLCdMYWNSZXByZXNzb3InXSkpKQ0KbmFtZXMoY29sbWFwKSA9IHVuaXF1ZShyZXNbLCdMYWNSZXByZXNzb3InXSkNCnBkYXRhJExhY1JlcHJlc3NvciA9IGFzLmZhY3RvcihwZGF0YSRMYWNSZXByZXNzb3IpDQoNCnAyID0gZ2dwbG90KHBkYXRhLCBhZXModCwgTGFjWFlBLCBjb2xvdXIgPSBMYWNSZXByZXNzb3IpKSArIGdlb21fbGluZShzaXplID0gMS4yKSsNCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjb2xtYXApICsNCiAgZ2d0aXRsZSgnTGFjUmVwcmVzc29yID0gWzAsMV0sXG4gbGFjdG9zZSA9IDAuNyAoZml4ZWQpJykNCm11bHRpcGxvdChwMSwgcDIsIGNvbHMgPSAyKQ0KYGBgDQoNCiNHZW5lcmFsaXphdGlvbiBvZiBjb21wbGV4IHJlZ3VsYXRvcnkgYmVoYXZpb3VyDQpBIHJlcHJlc3NlcyBDIHdpdGggdGhlIGNvcmVwcmVzc29yIEwuIFggaW5oaWJpdHMgdGhpcyByZXByZXNzaW9uLg0KDQp4LWF4aXMgaXMgTA0KDQp5LWF4aXMgaXMgWA0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojMSBhY3RpdmF0b3IgMSBpbmhpYml0b3IgT1INCmdvciA9IG5ldygnR3JhcGhHUk4nKQ0KZm9yIChuIGluIGMoJ0EnLCdDJywnTCcsJ1gnKSkgew0KICBnb3IgPSBhZGROb2RlKGdvciwgbikNCn0NCmdvciA9IGFkZEVkZ2UoZ29yLCAnQScsICdDJywgYWN0aXZhdGlvbiA9IEYpDQpnb3IgPSBhZGRFZGdlKGdvciwgJ1gnLCAnQycsIGFjdGl2YXRpb24gPSBUKQ0KZ29yID0gYWRkRWRnZShnb3IsICdMJywgJ0MnLCBhY3RpdmF0aW9uID0gRikNCg0KI2FjdGl2YXRpb24gZnVuY3Rpb24NCmYgPSBmdW5jdGlvbihBLCBMLCBYKSB7DQogIEMgPSAwDQogIGV2YWwocGFyc2UodGV4dCA9IGdlbmVyYXRlUmF0ZUVxbihnZXROb2RlKGdvciwgJ0MnKSwgZ29yKSkpDQp9DQoNCkEgPSBzZXEoMCwgMSwgYnkgPSAwLjAxKQ0KTCA9IHNlcSgwLCAxLCBieSA9IDAuMDEpDQpYID0gc2VxKDAsIDEsIGJ5ID0gMC4wMSkNCg0KQyA9IGYoQSwgTCwgWCkNCmhtZGYgPSBleHBhbmQuZ3JpZCgnTCcgPSBzZXEoMCwgMSwgYnkgPSAwLjAxKSwgJ1gnID0gc2VxKDAsIDEsIGJ5ID0gMC4wMSkpDQpobWRmJEMgPSBmKDAuMSwgaG1kZiRMLCBobWRmJFgpDQoNCiNwbG90bHkgc2xpZGVyDQphdmFsID0gbGlzdCgpDQpuc3RlcHMgPSAxMQ0KZm9yIChpIGluIDE6bnN0ZXBzKXsNCiAgaG1kZiA9IGV4cGFuZC5ncmlkKCdMJyA9IHNlcSgwLCAxLCBieSA9IDAuMDEpLCAnWCcgPSBzZXEoMCwgMSwgYnkgPSAwLjAxKSkNCiAgQSA9IGkvbnN0ZXBzDQogIGF2YWxbW2ldXSA8LWxpc3QodmlzaWJsZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSByb3VuZChBLCBkaWdpdHMgPSAyKSwNCiAgICAgICAgICAgICAgICAgICAgICB4ID0gaG1kZiRMLA0KICAgICAgICAgICAgICAgICAgICAgIHkgPSBobWRmJFgsDQogICAgICAgICAgICAgICAgICAgICAgeiA9IGYoQSwgaG1kZiRMLCBobWRmJFgpKQ0KICANCiAgYXZhbFtpXVtbMV1dJHpbMV0gPSAwDQp9DQphdmFsWzFdW1sxXV0kdmlzaWJsZSA9IFRSVUUNCg0Kc3RlcHMgPC0gbGlzdCgpDQpwIDwtIHBsb3RfbHkoeGF4aXMgPSBsaXN0KHRpdGxlID0gJ0wnKSwgeWF4aXMgPSBsaXN0KHRpdGxlID0gJ1gnKSkNCmZvciAoaSBpbiAxOm5zdGVwcykgew0KICBwID0gYWRkX2hlYXRtYXAocCx4PWF2YWxbaV1bWzFdXSR4LCAgeT1hdmFsW2ldW1sxXV0keSwgej1hdmFsW2ldW1sxXV0keiwgdmlzaWJsZSA9IGF2YWxbaV1bWzFdXSR2aXNpYmxlLCANCiAgICAgICAgICAgICAgICAgbmFtZSA9IGF2YWxbaV1bWzFdXSRuYW1lLCBzaG93bGVnZW5kID0gRkFMU0UpDQoNCiAgc3RlcCA8LSBsaXN0KGFyZ3MgPSBsaXN0KCd2aXNpYmxlJywgcmVwKEZBTFNFLCBsZW5ndGgoYXZhbCkpKSwNCiAgICAgICAgICAgICAgIG1ldGhvZCA9ICdyZXN0eWxlJykNCiAgc3RlcCRhcmdzW1syXV1baV0gPSBUUlVFICANCiAgc3RlcHNbW2ldXSA9IHN0ZXAgDQp9DQoNCnAgPSBwICU+JQ0KICBsYXlvdXQoc2xpZGVycyA9IGxpc3QobGlzdChhY3RpdmUgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50dmFsdWUgPSBsaXN0KHByZWZpeCA9ICJBOiAiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcHMgPSBzdGVwcykpKQ0KcA0KYGBgDQoNCiNDb25kaXRpb25hbCBkZXBlbmRlbmNlDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCnBsb3RkcyA8LSBmdW5jdGlvbihkLCBwdGl0bGUsIHJ0ZXFuKXsNCiAgcGxvdGQgPSBhcy5kYXRhLmZyYW1lKHQoZCkpDQogIGNvcnMgPSBjb3IocGxvdGQpDQogIGNvcnMgPSByb3VuZChjb3JzLCBkaWdpdHMgPSAyKQ0KICAjc2NvcmUgY2FsY3VsYXRpb24NCiAgY2xhc3NmID0gTWNsdXN0KGRbJ0InLF0sIHZlcmJvc2UgPSBGKSRjbGFzc2lmaWNhdGlvbg0KICAjY2FsYyBjb3JzDQogIGNvcmxvd0IgPSByb3VuZChjb3IocGxvdGRbY2xhc3NmID09IDEsIDE6Ml0pWzEsIDJdLCBkaWdpdHMgPSAyKQ0KICBjb3JoaWdoQiA9IHJvdW5kKGNvcihwbG90ZFtjbGFzc2YgPT0gMiwgMToyXSlbMSwgMl0sIGRpZ2l0cyA9IDIpDQogIGNsYXNzZltjbGFzc2YgPT0gMV0gPSBwYXN0ZSgnbG93IEIgKCcsIGNvcmxvd0IsICcpJywgc2VwID0gJycpDQogIGNsYXNzZltjbGFzc2YgPT0gMl0gPSBwYXN0ZSgnaGlnaCBCICgnLCBjb3JoaWdoQiwgJyknLCBzZXAgPSAnJykNCiAgcGxvdGQkQkNsYXNzID0gY2xhc3NmDQogIA0KICBwMSA9IGdncGxvdChwbG90ZCwgYWVzKEEsIEMsIGNvbG91ciA9IEIpKSArIGdlb21fcG9pbnQoKSArDQogICAgc2NhbGVfY29sb3VyX2Rpc3RpbGxlcihwYWxldHRlID0gJ1JkUHUnLCBkaXJlY3Rpb24gPSAxKSArDQogICAgZ2d0aXRsZShwYXN0ZShwdGl0bGUsICcgKGNvciA9ICcsIGNvcnNbJ0EnLCAnQyddLCAnKScsIHNlcCA9ICcnKSkgKw0KICAgIGZhY2V0X3dyYXAofkJDbGFzcykgKw0KICAgIHRoZW1lX21pbmltYWwoKSArDQogICAgdGhlbWUoDQogICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91cj0iYmxhY2siKSwNCiAgICAgIHN0cmlwLmJhY2tncm91bmQ9ZWxlbWVudF9yZWN0KGNvbG91cj0iI2YwZjBmMCIsZmlsbD0iI2YwZjBmMCIpDQogICAgKQ0KICANCiAgI2FjdGl2YXRpb24gZnVuY3Rpb24gcGxvdHMNCiAgZiA9IGZ1bmN0aW9uKEEsIEIsIHJhdGVlcW4pIHsNCiAgICBDID0gMA0KICAgIGV2YWwocGFyc2UodGV4dCA9IHJhdGVlcW4pKQ0KICB9DQogIA0KICAjcGxvdCBhY3RpdmF0aW9uIGZ1bmN0aW9ucw0KICBwbG90ZCA9IGFzLmRhdGEuZnJhbWUodChkKSkNCiAgcGRhdGEgPSBleHBhbmQuZ3JpZCgnQScgPSBzZXEoMCwgMSwgbGVuZ3RoLm91dCA9IDEwMCksICdCJyA9IHNlcSgwLCAxLCBsZW5ndGgub3V0ID0gMTAwKSkNCiAgcGRhdGFbJ0FjdGl2YXRpb24nXSA9IGYocGRhdGEkQSwgcGRhdGEkQiwgcnRlcW4pDQogIHBsb3RkJEFjdGl2YXRpb24gPSAxDQogIA0KICBwMiA9IGdncGxvdChwZGF0YSwgYWVzKEEsIEIsIGZpbGwgPSBBY3RpdmF0aW9uKSkgKw0KICAgIGdlb21fcmFzdGVyKCkgKw0KICAgIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAnWWxPclJkJywgZGlyZWN0aW9uID0gMSkgKw0KICAgIGdndGl0bGUoJzEgYWN0IDEgaW5oaWIgZGVwZW5kZW50JykgKw0KICAgIHRoZW1lX21pbmltYWwoKSArDQogICAgdGhlbWUoDQogICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJw0KICAgICkgKw0KICAgIGdlb21fcG9pbnQoZGF0YSA9IHBsb3RkLCBhZXMoQSwgQiksIGNvbG91ciA9ICd3aGl0ZScsIGFscGhhID0gMC4yLCBzaXplID0gMikNCiAgDQogIGx5dCA9IG1hdHJpeChjKDEsMSwyKSxucm93ID0gMSkNCiAgbXVsdGlwbG90KHAxLCBwMiwgbGF5b3V0ID0gbHl0KQ0KfQ0KDQpzaW1zZWVkID0gMzYwDQpuc2FtcCA9IDEwMA0KYGBgDQoNCklucHV0IG1vZGVscyBzZXR0aW5nDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmcgPSBuZXcoJ0dyYXBoR1JOJykNCmZvciAobiBpbiBjKCdCJywgJ0EnICwnQycpKSB7DQogIGcgPSBhZGROb2RlKGcsIG4pDQp9DQpnID0gYWRkRWRnZShnLCAnQicsICdDJywgYWN0aXZhdGlvbiA9IFQpDQpnID0gYWRkRWRnZShnLCAnQScsICdDJywgYWN0aXZhdGlvbiA9IFQpDQoNCnNpbSA9IG5ldygnU2ltdWxhdGlvbkdSTicsIGdyYXBoID0gZywgc2VlZCA9IHNpbXNlZWQpDQppbnB1dE1vZGVscyA9IHNpbSRpbnB1dE1vZGVscw0KDQojbW9kZWwgbW9kaWZpY2F0aW9uDQppbnB1dE1vZGVscyRCJG1lYW4gPSBjKDAuMiwgMC44KQ0KaW5wdXRNb2RlbHMkQSRtZWFuID0gMC41DQppbnB1dE1vZGVscyRBJHNkID0gMC4xNQ0KaW5wdXRNb2RlbHMkQiRzZCA9IGMoMC4wNSwgMC4wNSkNCnNpbSRpbnB1dE1vZGVscyA9IGlucHV0TW9kZWxzDQoNCiNwbG90IGRlbnNpdGllcyBvZiBpbnB1dHMNCnNldC5zZWVkKHNpbXNlZWQpDQojIGV4dGlucHV0cyA9IG1hdHJpeChydW5pZihuc2FtcCAqIDIpLCBuY29sID0gMikNCiMgY29sbmFtZXMoZXh0aW5wdXRzKSA9IGMoJ0EnLCAnQicpDQpleHRpbnB1dHMgPSBOVUxMDQpkID0gc2ltdWxhdGVEYXRhc2V0KHNpbSwgbnNhbXAsIGV4dGlucHV0cykNCg0KcGxvdGQgPSBhcy5kYXRhLmZyYW1lKHQoZCkpDQpjb3JzID0gY29yKHBsb3RkKQ0KY29ycyA9IHJvdW5kKGNvcnMsIGRpZ2l0cyA9IDIpDQoNCmhpc3RkID0gZGF0YS5mcmFtZSgnRXhwcicgPSBjKHBsb3RkJEEsIHBsb3RkJEIpLCAnR2VuZScgPSByZXAoYygnQScsICdCJyksIGVhY2ggPSBucm93KHBsb3RkKSkpDQpnZ3Bsb3QoaGlzdGQsIGFlcyhFeHByLCBmaWxsID0gR2VuZSkpICsgZ2VvbV9oaXN0b2dyYW0oYWxwaGEgPSAwLjcsIHBvc2l0aW9uID0gJ2lkZW50aXR5JykgKw0KZ2d0aXRsZShwYXN0ZSgnSW5wdXQgZGF0YScsICcgKGNvciA9ICcsIGNvcnNbJ0EnLCAnQiddLCAnKScsIHNlcCA9ICcnKSkgKw0KdGhlbWVfbWluaW1hbCgpICsNCnRoZW1lKA0KICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpDQogICkNCg0KIzIgYWN0aXZhdG9ycyBPUg0KZyA9IG5ldygnR3JhcGhHUk4nKQ0KZm9yIChuIGluIExFVFRFUlNbMTozXSkgew0KICBnID0gYWRkTm9kZShnLCBuKQ0KfQ0KZyA9IGFkZEVkZ2UoZywgJ0EnLCAnQycsIGFjdGl2YXRpb24gPSBUKQ0KZyA9IGFkZEVkZ2UoZywgJ0InLCAnQycsIGFjdGl2YXRpb24gPSBUKQ0Kc2ltID0gbmV3KCdTaW11bGF0aW9uR1JOJywgZ3JhcGggPSBnLCBzZWVkID0gc2ltc2VlZCkNCnNpbSRpbnB1dE1vZGVscyA9IGlucHV0TW9kZWxzDQpkID0gc2ltdWxhdGVEYXRhc2V0KHNpbSwgbnNhbXApDQpwbG90ZHMoZCwgJ0EgT1IgQicsIGdlbmVyYXRlUmF0ZUVxbihnZXROb2RlKGcsICdDJyksIGcpKQ0KDQojMiByZXByZXNzb3JzIE9SDQpnID0gbmV3KCdHcmFwaEdSTicpDQpmb3IgKG4gaW4gTEVUVEVSU1sxOjNdKSB7DQogIGcgPSBhZGROb2RlKGcsIG4pDQp9DQpnID0gYWRkRWRnZShnLCAnQScsICdDJywgYWN0aXZhdGlvbiA9IEYpDQpnID0gYWRkRWRnZShnLCAnQicsICdDJywgYWN0aXZhdGlvbiA9IEYpDQpzaW0gPSBuZXcoJ1NpbXVsYXRpb25HUk4nLCBncmFwaCA9IGcsIHNlZWQgPSBzaW1zZWVkKQ0Kc2ltJGlucHV0TW9kZWxzID0gaW5wdXRNb2RlbHMNCmQgPSBzaW11bGF0ZURhdGFzZXQoc2ltLCBuc2FtcCkNCnBsb3RkcyhkLCAnIUEgT1IgIUInLCBnZW5lcmF0ZVJhdGVFcW4oZ2V0Tm9kZShnLCAnQycpLCBnKSkNCg0KIzEgcmVwcmVzc29yLCAxIEFjdGl2YXRvciBPUg0KZyA9IG5ldygnR3JhcGhHUk4nKQ0KZm9yIChuIGluIExFVFRFUlNbMTozXSkgew0KICBnID0gYWRkTm9kZShnLCBuKQ0KfQ0KZyA9IGFkZEVkZ2UoZywgJ0EnLCAnQycsIGFjdGl2YXRpb24gPSBGKQ0KZyA9IGFkZEVkZ2UoZywgJ0InLCAnQycsIGFjdGl2YXRpb24gPSBUKQ0Kc2ltID0gbmV3KCdTaW11bGF0aW9uR1JOJywgZ3JhcGggPSBnLCBzZWVkID0gc2ltc2VlZCkNCnNpbSRpbnB1dE1vZGVscyA9IGlucHV0TW9kZWxzDQpkID0gc2ltdWxhdGVEYXRhc2V0KHNpbSwgbnNhbXApDQpwbG90ZHMoZCwgJyFBIE9SIEInLCBnZW5lcmF0ZVJhdGVFcW4oZ2V0Tm9kZShnLCAnQycpLCBnKSkNCg0KIzIgYWN0aXZhdG9ycyBBTkQNCmcgPSBuZXcoJ0dyYXBoR1JOJykNCmZvciAobiBpbiBMRVRURVJTWzE6M10pIHsNCiAgZyA9IGFkZE5vZGUoZywgbikNCn0NCmcgPSBhZGRFZGdlKGcsIGMoJ0EnLCAnQicpLCAnQycsIGFjdGl2YXRpb24gPSBjKFQsIFQpLCBlZGdldHlwZSA9ICdhbmQnKQ0Kc2ltID0gbmV3KCdTaW11bGF0aW9uR1JOJywgZ3JhcGggPSBnLCBzZWVkID0gc2ltc2VlZCkNCnNpbSRpbnB1dE1vZGVscyA9IGlucHV0TW9kZWxzDQpkID0gc2ltdWxhdGVEYXRhc2V0KHNpbSwgbnNhbXApDQpwbG90ZHMoZCwgJ0EgQU5EIEInLCBnZW5lcmF0ZVJhdGVFcW4oZ2V0Tm9kZShnLCAnQycpLCBnKSkNCg0KIzIgcmVwcmVzc29ycyBBTkQNCmcgPSBuZXcoJ0dyYXBoR1JOJykNCmZvciAobiBpbiBMRVRURVJTWzE6M10pIHsNCiAgZyA9IGFkZE5vZGUoZywgbikNCn0NCmcgPSBhZGRFZGdlKGcsIGMoJ0EnLCAnQicpLCAnQycsIGFjdGl2YXRpb24gPSBjKEYsIEYpLCBlZGdldHlwZSA9ICdhbmQnKQ0Kc2ltID0gbmV3KCdTaW11bGF0aW9uR1JOJywgZ3JhcGggPSBnLCBzZWVkID0gc2ltc2VlZCkNCnNpbSRpbnB1dE1vZGVscyA9IGlucHV0TW9kZWxzDQpkID0gc2ltdWxhdGVEYXRhc2V0KHNpbSwgbnNhbXApDQpwbG90ZHMoZCwgJyFBIEFORCAhQicsIGdlbmVyYXRlUmF0ZUVxbihnZXROb2RlKGcsICdDJyksIGcpKQ0KDQojMSByZXByZXNzb3IsIDEgQWN0aXZhdG9yIEFORA0KZyA9IG5ldygnR3JhcGhHUk4nKQ0KZm9yIChuIGluIExFVFRFUlNbMTozXSkgew0KICBnID0gYWRkTm9kZShnLCBuKQ0KfQ0KZyA9IGFkZEVkZ2UoZywgYygnQScsICdCJyksICdDJywgYWN0aXZhdGlvbiA9IGMoVCwgRiksIGVkZ2V0eXBlID0gJ2FuZCcpDQpzaW0gPSBuZXcoJ1NpbXVsYXRpb25HUk4nLCBncmFwaCA9IGcsIHNlZWQgPSBzaW1zZWVkKQ0Kc2ltJGlucHV0TW9kZWxzID0gaW5wdXRNb2RlbHMNCmQgPSBzaW11bGF0ZURhdGFzZXQoc2ltLCBuc2FtcCkNCnBsb3RkcyhkLCAnQSBBTkQgIUInLCBnZW5lcmF0ZVJhdGVFcW4oZ2V0Tm9kZShnLCAnQycpLCBnKSkNCmBgYA0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0K